
package mt.client;

import java.util.LinkedList;
import javax.swing.*;
import mt.Order;
import mt.dummy.ClientCommDummy;
import mt.dummy.MicroTraderClientDummy;

/**
 * @author Diogo Simões Nº55494, Samuel Martins Nº38011, Antonio Costa nº54758
 */
public class GUI extends JFrame {

	/**
	 * construtor da GUI
	 * recebe como parâmetro um clientComm do tipo ClientCommDummy 
	 * executa o método initComponents()
	 * @param clientComm ClientCommDummy
	 */
	public GUI(final ClientCommDummy clientComm) {
		initComponents();
	}    

	
	@SuppressWarnings("unchecked")	
//	funcao initComponents, inicializa todas as variaveis necessárias à GUI ( comunicação com o cliente 
	/**
	 * Inicializa todas as variáveis utilizadas pela GUI
	 * Constroi e controla todas as 5 frames utilizadas (Gui, Menus, painelDeCompra, painelDeVenda,
	 * paineDeHistorico)
	 */
	private void initComponents() {
//	ordem de compra/venda
		order = null;
//	cliente
		client = new ClientCommDummy();
//	micro trader client ( comunicação com o servidor )
		micro = new MicroTraderClientDummy();
//	linked list - lista de ordens ( de compra e venda inseridas por cada utilizador )
		ordens=new LinkedList<Order>();
//	frames utilizadas para os varios paineis acedidos pelo cliente
		painelDeVenda = new JFrame();
		painelDeCompra = new JFrame();
		painelDeHistorico = new JFrame();
		menus = new JFrame();
//	Botões
		submitCompra = new JButton();
		botaoSubmitCompra = new JButton();
		botaoSubmitVenda = new JButton();
		botaoVerHistórico = new JButton();
		botaoDisconectar = new JButton();
		submitVenda = new JButton();
		botaoVoltar = new JButton();
		BotaoLigar = new JButton();
//	Labels
		jLabel3 = new JLabel();
		jLabel4 = new JLabel();
		jLabel5 = new JLabel();
		jLabel6 = new JLabel();
		jLabel7 = new JLabel();
		jLabel8 = new JLabel();
		jLabel9 = new JLabel();
		jLabel10 = new JLabel();
		jLabel11 = new JLabel();
		jLabel1 = new JLabel();
		jLabel2 = new JLabel();
//	Campos de inserçao de dados - compra
		tipoAcçaoCompra = new JTextField();
		qtCompra = new JTextField();
		precoUnidCompra = new JTextField();
//		Campos de inserçao de dados - venda
		tipoAcçaoVenda = new JTextField();
		qtVenda = new JTextField();
		precoUnidVenda = new JTextField();
//	nickname
		nickName = new JTextField();
//	paineis de visualizaçao de ordens (compra e venda) 
		textArea1 = new java.awt.TextArea();
		textAreaMessages = new java.awt.TextArea();
		
//	Adicionar actionlisteners aos botões
//	botão botaoSubmitCompra
		botaoSubmitCompra.setText("Submeter Ordens de compra");
		botaoSubmitCompra.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				botaoSubmitCompraActionPerformed(evt);
			}
		});

//		botão botaoSubmitVenda
		botaoSubmitVenda.setText("Submeter Ordens de Venda");
		botaoSubmitVenda.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				botaoSubmitVendaActionPerformed(evt);
			}
		});

//		botão botaoVerHistórico
		botaoVerHistórico.setText("Ver histórico das suas Ordens");
		botaoVerHistórico.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				botaoVerHistóricoActionPerformed(evt);
			}
		});

//		botão botaoDisconectar
		botaoDisconectar.setText("Desconectar");
		botaoDisconectar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				botaoDisconectarActionPerformed(evt);
			}
		});

//		2º painel - Menus
//		criação layout do tipo GroupLayout 
		javax.swing.GroupLayout MenusLayout = new javax.swing.GroupLayout(menus.getContentPane());
		menus.getContentPane().setLayout(MenusLayout);
//		implementação do layout à frame menus e adição de todos os componentes relevantes
		MenusLayout.setHorizontalGroup(
				MenusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(MenusLayout.createSequentialGroup()
						.addGroup(MenusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
								.addComponent(botaoSubmitVenda, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(botaoSubmitCompra, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(botaoVerHistórico, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(botaoDisconectar))
								.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(textAreaMessages, javax.swing.GroupLayout.PREFERRED_SIZE, 348, javax.swing.GroupLayout.PREFERRED_SIZE))
				);
		MenusLayout.setVerticalGroup(
				MenusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(MenusLayout.createSequentialGroup()
						.addComponent(botaoSubmitVenda)
						.addGap(1, 1, 1)
						.addComponent(botaoSubmitCompra)
						.addGap(1, 1, 1)
						.addComponent(botaoVerHistórico)
						.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
						.addComponent(botaoDisconectar)
						.addContainerGap(22, Short.MAX_VALUE))
						.addComponent(textAreaMessages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				);

		jLabel3.setText("Coloque uma ordem de compra:");

		jLabel4.setText("Insira o Tipo de Acções:");

		jLabel5.setText("Insira a quantidade a comprar:");

		jLabel6.setText("Preço por unidade:");
		tipoAcçaoCompra.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				tipoAcçaoCompraActionPerformed(evt);
			}
		});

//		campo qtCompra
		qtCompra.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				qtCompraActionPerformed(evt);
			}
		});

//		campo precoUnidCompra
		precoUnidCompra.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				precoUnidCompraActionPerformed(evt);
			}
		});

//		botão submitCompra
		submitCompra.setText("Submeter");
		submitCompra.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				submitCompraActionPerformed(evt);
			}
		});

//		3º painel - Compra
//		criação layout do tipo GroupLayout
		GroupLayout painelDeCompraLayout = new GroupLayout(painelDeCompra.getContentPane());
		painelDeCompra.getContentPane().setLayout(painelDeCompraLayout);
//		implementação do layout à frame painelDeCompra e adição de todos os componentes relevantes
		painelDeCompraLayout.setHorizontalGroup(
				painelDeCompraLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(painelDeCompraLayout.createSequentialGroup()
						.addComponent(jLabel3)
						.addGap(0, 0, Short.MAX_VALUE))
						.addGroup(painelDeCompraLayout.createSequentialGroup()
								.addComponent(jLabel4, GroupLayout.DEFAULT_SIZE, 121, Short.MAX_VALUE)
								.addGap(18, 18, 18)
								.addComponent(jLabel5, GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE)
								.addGap(18, 18, 18)
								.addComponent(jLabel6, GroupLayout.DEFAULT_SIZE, 99, Short.MAX_VALUE))
								.addGroup(painelDeCompraLayout.createSequentialGroup()
										.addComponent(tipoAcçaoCompra)
										.addGap(18, 18, 18)
										.addGroup(painelDeCompraLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
												.addGroup(painelDeCompraLayout.createSequentialGroup()
														.addComponent(submitCompra)
														.addGap(0, 0, Short.MAX_VALUE))
														.addGroup(painelDeCompraLayout.createSequentialGroup()
																.addComponent(qtCompra)
																.addGap(18, 18, 18)
																.addComponent(precoUnidCompra))))
				);
		painelDeCompraLayout.setVerticalGroup(
				painelDeCompraLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(painelDeCompraLayout.createSequentialGroup()
						.addComponent(jLabel3)
						.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
						.addGroup(painelDeCompraLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
								.addComponent(jLabel4)
								.addComponent(jLabel5)
								.addComponent(jLabel6))
								.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
								.addGroup(painelDeCompraLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
										.addComponent(tipoAcçaoCompra, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
										.addComponent(qtCompra, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
										.addComponent(precoUnidCompra, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
										.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(submitCompra)
										.addContainerGap())
				);

		jLabel7.setText("Coloque uma ordem de venda:");

		jLabel8.setText("Insira o Tipo de Acções:");

		jLabel9.setText("Insira a quantidade a vender:");

		jLabel10.setText("Preço por unidade:");

//		Adicionar actionlisteners aos campos de inserçao de dados
//		campo precoUnidVenda
		precoUnidVenda.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				precoUnidVendaActionPerformed(evt);
			}
		});

//		campo qtVenda
		qtVenda.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				qtVendaActionPerformed(evt);
			}
		});

//		campo tipoAcçaoVenda
		tipoAcçaoVenda.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				tipoAcçaoVendaActionPerformed(evt);
			}
		});

//		botão submitVenda
		submitVenda.setText("Submeter");
		submitVenda.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				submitVendaActionPerformed(evt);
			}
		});
		
//		4º painel - Venda
//		criação layout do tipo GroupLayout
		GroupLayout PainelDeVendaLayout = new GroupLayout(painelDeVenda.getContentPane());
		painelDeVenda.getContentPane().setLayout(PainelDeVendaLayout);
//		implementação do layout à frame painelDeVenda e adição de todos os componentes relevantes
		PainelDeVendaLayout.setHorizontalGroup(
				PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addComponent(jLabel7)
				.addGroup(PainelDeVendaLayout.createSequentialGroup()
						.addGroup(PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
								.addComponent(jLabel8, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(tipoAcçaoVenda, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE))
								.addGap(18, 18, 18)
								.addGroup(PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
										.addComponent(qtVenda)
										.addComponent(jLabel9, GroupLayout.PREFERRED_SIZE, 144, GroupLayout.PREFERRED_SIZE))
										.addGap(18, 18, 18)
										.addGroup(PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
												.addComponent(jLabel10, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
												.addComponent(precoUnidVenda, GroupLayout.PREFERRED_SIZE, 91, GroupLayout.PREFERRED_SIZE)))
												.addGroup(PainelDeVendaLayout.createSequentialGroup()
														.addGap(178, 178, 178)
														.addComponent(submitVenda))
				);
		PainelDeVendaLayout.setVerticalGroup(
				PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(PainelDeVendaLayout.createSequentialGroup()
						.addComponent(jLabel7)
						.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
						.addGroup(PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
								.addComponent(jLabel8)
								.addComponent(jLabel9)
								.addComponent(jLabel10))
								.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
								.addGroup(PainelDeVendaLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
										.addComponent(tipoAcçaoVenda, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
										.addComponent(qtVenda, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
										.addComponent(precoUnidVenda, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
										.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(submitVenda))
				);

		jLabel11.setText("Consulte aqui o seu Histórico de ordens:");
		
//		Adicionar actionlisteners ao botão
//		botão botaoVoltar
		botaoVoltar.setText("Voltar");
		botaoVoltar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				botaoVoltarActionPerformed(evt);
			}
		});

//		5º painel - Histórico
//		criação layout do tipo GroupLayout
		GroupLayout PainelDeHistoricoLayout = new GroupLayout(painelDeHistorico.getContentPane());
		painelDeHistorico.getContentPane().setLayout(PainelDeHistoricoLayout);
//		implementação do layout à frame painelDeHistorico e adição de todos os componentes relevantes
		PainelDeHistoricoLayout.setHorizontalGroup(
				PainelDeHistoricoLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(PainelDeHistoricoLayout.createSequentialGroup()
						.addComponent(jLabel11)
						.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 173, Short.MAX_VALUE)
						.addComponent(botaoVoltar))
						.addComponent(textArea1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				);
		PainelDeHistoricoLayout.setVerticalGroup(
				PainelDeHistoricoLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(PainelDeHistoricoLayout.createSequentialGroup()
						.addGroup(PainelDeHistoricoLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
								.addComponent(jLabel11)
								.addComponent(botaoVoltar))
								.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(textArea1, GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE))
				);

		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


		jLabel1.setText("Insira o seu nickname e clique para ligar ao servidor");

//		Adicionar actionlisteners ao botão
//		botão BotaoLigar
		BotaoLigar.setText("Ligar");
		BotaoLigar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				BotaoLigarActionPerformed(evt);
			}
		});

//		Adicionar actionlisteners ao campo de inserçao do nickname
//		campo nickName
		nickName.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				nickNameActionPerformed(evt);
			}
		});

		jLabel2.setText("*O Nickname não pode estar vazio.");

//		1º painel - Log In
//		criação layout do tipo GroupLayout
		GroupLayout layout = new GroupLayout(getContentPane());
//		implementação do layout à frame gui e adição de todos os componentes relevantes
		getContentPane().setLayout(layout);
		layout.setHorizontalGroup(
				layout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
						.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
								.addGroup(layout.createSequentialGroup()
										.addComponent(nickName, GroupLayout.PREFERRED_SIZE, 159, GroupLayout.PREFERRED_SIZE)
										.addGap(33, 33, 33)
										.addComponent(BotaoLigar))
										.addComponent(jLabel1)
										.addComponent(jLabel2, GroupLayout.Alignment.LEADING))
										.addGap(0, 8, Short.MAX_VALUE))
				);
		layout.setVerticalGroup(
				layout.createParallelGroup(GroupLayout.Alignment.LEADING)
				.addGroup(layout.createSequentialGroup()
						.addComponent(jLabel1)
						.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
						.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
								.addComponent(nickName, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
								.addComponent(BotaoLigar))
								.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(jLabel2))
				);
		setResizable(false);
		pack();
	}                     

//	Botão BotaoLigar foi carregado
	/**
	 * Este método é invocado quando o ActionListener do botão BotaoLigar, da frame Gui,
	 * recebe um evento evt (clique).
	 * Efectua a conecção do utilizador - cliente - ao servidor através do connect()
	 * Abre nova frame Menus
	 * 
	 */
	private void BotaoLigarActionPerformed(java.awt.event.ActionEvent evt) { 
//		verifica se o campo está vazio
		if(!nickName.getText().isEmpty()){
//			conecta o cliente executando o connect() e enviando o host e o nickname
			client.connect("localhost", nickName.getText());
//			"lança" nova janela ( menus )
			textAreaMessages.setEditable(false);
			menus.setVisible(true);
			menus.setResizable(false);
			menus.repaint();
			menus.revalidate();
			menus.pack();
//			fecha janela actual ( Log In )
			this.dispose();
			System.out.println("User: "+nickName.getText()+" conectou-se.");    
		}
	}      
//	foi inserido texto no nickname
	/**
	 * Retira nickName da JTextField
	 */
	private void nickNameActionPerformed(java.awt.event.ActionEvent evt) {  
//		guarda o nick inserido na variável nickName
		this.nickName=nickName;
	}                                        

//	Botão botaoSubmitCompra foi carregado
	/**
	 * Abre nova frame painelDeCompra
	 */
	private void botaoSubmitCompraActionPerformed(java.awt.event.ActionEvent evt) {  
//		"lança" nova janela ( painelDeCompra )
		painelDeCompra.setVisible(true);
		painelDeCompra.setResizable(false);
		painelDeCompra.repaint();
		painelDeCompra.revalidate();
		painelDeCompra.pack();
//		fecha janela actual ( menus )
		menus.dispose();
		System.out.println("Carregou no botao submit compra");
	}                                                 

//	Botão botaoSubmitVenda foi carregado
	/**
	 * Abre nova frame painelDeVenda
	 */
	private void botaoSubmitVendaActionPerformed(java.awt.event.ActionEvent evt) { 
//		"lança" nova janela ( painelDeVenda )
		painelDeVenda.setVisible(true);
		painelDeVenda.setResizable(false);
		painelDeVenda.repaint();
		painelDeVenda.revalidate();
		painelDeVenda.pack();
//		fecha janela actual ( menus )
		menus.dispose();
		System.out.println("Carregou no botao submit venda");
	}                                                

//	Botão botaoVerHistórico foi carregado
	/**
	 * Abre nova frame painelDeHistorico
	 */
	private void botaoVerHistóricoActionPerformed(java.awt.event.ActionEvent evt) {                    
//		"lança" nova janela ( painelDeVenda )
		painelDeHistorico.setVisible(true);
		textArea1.setEditable(false);
		painelDeHistorico.repaint();
		painelDeHistorico.revalidate();
		painelDeHistorico.pack();
//		fecha janela actual ( menus )
		menus.dispose();
		System.out.println("Carregou no botao ver histórico");
	}                                                 

//	Botão botaoDisconectar foi carregado
	/**
	 * Disconecta utilizador - cliente - do servidor através do disconnect()
	 * Fecha o programa
	 */
	private void botaoDisconectarActionPerformed(java.awt.event.ActionEvent evt) {
//		disconecta utilizador 
		client.disconnect();
//		fecha janela actual ( menus )  
		menus.dispose();
		System.out.println("User: "+nickName.getText()+" desconectou-se.");
//		termina programa
		System.exit(0);

	}                                                
	/**
	 * Retira tipoAcçaoCompra da JTextField
	 */
	private void tipoAcçaoCompraActionPerformed(java.awt.event.ActionEvent evt) {                                                
		this.tipoAcçaoCompra=tipoAcçaoCompra;

	}                                               
	/**
	 * Retira qtCompra da JTextField
	 */
	private void qtCompraActionPerformed(java.awt.event.ActionEvent evt) {                                         
		this.qtCompra=qtCompra;
	}                                        
	/**
	 * Retira precoUnidCompra da JTextField
	 */
	private void precoUnidCompraActionPerformed(java.awt.event.ActionEvent evt) {                                                
		this.precoUnidCompra=precoUnidCompra;
	}                                               

//	Botão submitCompra foi carregado
	/**
	 * Este método cria uma nova ordem de compra através createBuyOrder(),
	 * enviando como parametros os dados introduzidos pelo utilizador
	 * precoUnidCompra, qtCompra, tipoAcçaoCompra
	 * Envia essa ordem de compra para o servidor através do sendOrder()
	 * Adiciona ordem ao historico do utilizador - cliente
	 * Limpa as JTextFields
	 * Abre novamente a frame Menus
	 */
	private void submitCompraActionPerformed(java.awt.event.ActionEvent evt) {                                             
//		"lança" nova janela ( menus )
		menus.setVisible(true);
		menus.setResizable(false);
		menus.repaint();
		menus.revalidate();
		menus.pack();
//		fecha janela actual ( painelDeCompra ) 
		painelDeCompra.dispose();
//		verifica que os campos nao estao vazios
		if(!tipoAcçaoCompra.getText().isEmpty() && !qtCompra.getText().isEmpty() && !precoUnidCompra.getText().isEmpty()){
//			verifica que os campos numéricos recebem numeros positivos
			if(Integer.parseInt(qtCompra.getText())>0 && Double.parseDouble(precoUnidCompra.getText())>0){
//				envia ordem de compra criada pelo utilizador
				client.sendOrder(order.createBuyOrder(nickName.getText(), tipoAcçaoCompra.getText(), Integer.parseInt(qtCompra.getText()), Double.parseDouble(precoUnidCompra.getText())));
				System.out.println("Ordem de compra submetida. User:"+nickName.getText()+" - Tipo: "+ tipoAcçaoCompra.getText()+" - QT: "+ Integer.parseInt(qtCompra.getText())+" - Punid: "+ Double.parseDouble(precoUnidCompra.getText()));
				//String registoCompra=order.toString();
				String registoCompra= "Compra: Tipo: "+ tipoAcçaoCompra.getText()+" - QT: "+ Integer.parseInt(qtCompra.getText())+" - Punid: "+ Double.parseDouble(precoUnidCompra.getText())+"\n";
//				adiciona a nova ordem de compra à jtext historico
				textArea1.append(registoCompra);
			}
		}
//		limpa os dados das jtextfield 
		tipoAcçaoCompra.setText(null);
		qtCompra.setText(null);
		precoUnidCompra.setText(null);
	}                                       

//	Botão submitVenda foi carregado
	/**
	 * Este método cria uma nova ordem de venda através createSellOrder(),
	 * enviando como parametros os dados introduzidos pelo utilizador
	 * precoUnidVenda, qtVenda, tipoAcçaoVenda
	 * Envia essa ordem de venda para o servidor através do sendOrder()
	 * Adiciona ordem ao historico do utilizador - cliente
	 * Limpa as JTextFields
	 * Abre novamente a frame Menus
	 */
	private void submitVendaActionPerformed(java.awt.event.ActionEvent evt) {                                             
//		"lança" nova janela ( menus )                                           
		menus.setVisible(true);
		menus.setResizable(false);
		menus.repaint();
		menus.revalidate();
		menus.pack();
//		fecha janela actual ( painelDeVenda ) 
		painelDeVenda.dispose();
//		verifica que os campos nao estao vazios
		if(!tipoAcçaoVenda.getText().isEmpty() && !qtVenda.getText().isEmpty() && !precoUnidVenda.getText().isEmpty()){
//			verifica que os campos numéricos recebem numeros positivos
			if(Integer.parseInt(qtVenda.getText())>0 && Double.parseDouble(precoUnidVenda.getText())>0){
//				envia ordem de venda criada pelo utilizador
				client.sendOrder(order.createSellOrder(nickName.getText(), tipoAcçaoVenda.getText(), Integer.parseInt(qtVenda.getText()), Double.parseDouble(precoUnidVenda.getText())));
				System.out.println("Ordem de venda submetida. User:"+nickName.getText()+" - Tipo: "+ tipoAcçaoVenda.getText()+" - QT: "+ Integer.parseInt(qtVenda.getText())+" - Punid: "+ Double.parseDouble(precoUnidVenda.getText()));
				String registoVenda= "Venda: Tipo: "+ tipoAcçaoVenda.getText()+" - QT: "+ Integer.parseInt(qtVenda.getText())+" - Punid: "+ Double.parseDouble(precoUnidVenda.getText())+"\n";
				//				String registoVenda=order.toString();
//				adiciona a nova ordem de venda à jtext historico
				textArea1.append(registoVenda);
			}
		}
//		limpa os dados das jtextfield 
		tipoAcçaoVenda.setText(null);
		qtVenda.setText(null);
		precoUnidVenda.setText(null);
	}    
	/**
	 * Retira precoUnidVenda da JTextField
	 */
	private void precoUnidVendaActionPerformed(java.awt.event.ActionEvent evt) {                                               
		this.precoUnidVenda=precoUnidVenda;
	}                                              
	/**
	 * Retira qtVenda da JTextField
	 */
	private void qtVendaActionPerformed(java.awt.event.ActionEvent evt) {                                        
		this.qtVenda=qtVenda;
	}                                       
	/**
	 * Retira tipoAcçaoVenda da JTextField
	 */
	private void tipoAcçaoVendaActionPerformed(java.awt.event.ActionEvent evt) {                                               
		this.tipoAcçaoVenda=tipoAcçaoVenda;
	}                                              


//	Botão botaoVoltar foi carregado
	/**
	 * Volta à frame Menus
	 */
	private void botaoVoltarActionPerformed(java.awt.event.ActionEvent evt) {                                                                                         
//		"lança" nova janela ( menus ) 
		menus.setVisible(true);
		menus.setResizable(false);
		menus.repaint();
		menus.revalidate();
		menus.pack();
//		fecha janela actual ( painelDeHistorico ) 
		painelDeHistorico.dispose();
	}                                           

	
	public static void main(String args[]) {
		try {
			for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
				if ("Nimbus".equals(info.getName())) {
					UIManager.setLookAndFeel(info.getClassName());
					break;
				}
			}
		} catch (ClassNotFoundException ex) {
			java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
		} catch (InstantiationException ex) {
			java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
		} catch (IllegalAccessException ex) {
			java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
		} catch (UnsupportedLookAndFeelException ex) {
			java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
		}

		new GUI(client).run();
	}

//	variáveis necessárias à GUI
	private LinkedList<Order> ordens = new LinkedList<Order>();
	public MicroTraderClientDummy micro;
	private JButton BotaoLigar;
	private JFrame menus;
	private JFrame painelDeHistorico;
	private JFrame painelDeVenda;
	private JFrame painelDeCompra;
	private JButton botaoDisconectar;
	private JButton botaoSubmitCompra;
	private JButton botaoSubmitVenda;
	private JButton botaoVerHistórico;
	private JButton botaoVoltar;
	private JLabel jLabel1;
	private JLabel jLabel10;
	private JLabel jLabel11;
	private JLabel jLabel2;
	private JLabel jLabel3;
	private JLabel jLabel4;
	private JLabel jLabel5;
	private JLabel jLabel6;
	private JLabel jLabel7;
	private JLabel jLabel8;
	private JLabel jLabel9;
	private JTextField nickName;
	private JTextField precoUnidCompra;
	private JTextField precoUnidVenda;
	private JTextField qtCompra;
	private JTextField qtVenda;
	private JButton submitCompra;
	private JButton submitVenda;
	private java.awt.TextArea textArea1;
	private JTextField tipoAcçaoCompra;
	private JTextField tipoAcçaoVenda;
	private static ClientCommDummy client;
	private static Order order = null;
	private LinkedList<Order> listaDeOrdens;
	private java.awt.TextArea textAreaMessages;

//	função que permite inserir as ordem recebidas pelo servidor ( através de mensagem ) no historico
	/**
	 * Este método percorre a LinkedList e envia as ordens para o historico de cada utilizador
	 * Recebe como parâmetro uma listaDeOrdens
	 * 
	 * @param listaDeOrdens LinkedList<Order>
	 */
	public void insertHistorico(LinkedList<Order> listaDeOrdens) {
		this.listaDeOrdens=listaDeOrdens;
//		percorre a lista de ordens recebida
		for (Order order : listaDeOrdens) {
//			filtra as ordens recebidas de modo a adicionar apenas as do utilizador em causa
			if(order.getNickname().equals(nickName.getText())){
//				adiciona cada ordem ao historico
				textArea1.append(order.toString()+"\n");
			}
		}
//		actualiza o historico
		textArea1.repaint();
	}

//	função que permite inserir as ordem recebidas pelo servidor ( através de mensagem ) na area de mensagens
	/**
	 * Este método percorre a LinkedList e envia as ordens para o ecrã de mensagens de cada utilizador
	 * Recebe como parâmetro uma listaDeOrdens
	 * 
	 * @param listaDeOrdens LinkedList<Order>
	 */
	public void showMessages(LinkedList<Order> listaDeOrdens){
		this.listaDeOrdens=listaDeOrdens;
//		percorre lista de ordens recebida
		for (Order order : listaDeOrdens) {
//		filtra as ordens recebidas de modo a adicionar todas excepto as do utilizador - não relevantes
			if(!order.getNickname().equals(nickName.getText())){
//				adiciona cada ordem à area de mensagens
				textAreaMessages.append(order.toString()+"\n");
			}
		}
//		actualiza o historico
		textAreaMessages.repaint();
	}
	
//	função que inicializa a GUI
	/**
	 * Este método executa a Gui
	 */
	public void run() {
		new GUI(client).setVisible(true);
	}
}
